import axios from 'axios'
import store from '@/store.js'
import jsonBig from 'json-bigint'
import {Toast,Dialog} from 'vant'
import router from '@/router.js'

// 6-7 更新头条接口为http://api-toutiao-web.itheima.net。
const request = axios.create({
	baseURL:"http://api-toutiao-web.itheima.net"
	
})
/**
 * 配置处理后端返回数据中超出 js 安全整数范围问题
 */
request.defaults.transformResponse = [function (data) {
  try {
    return jsonBig.parse(data)
  } catch (err) {
    return {}
  }
}]
request.interceptors.request.use(function(config){
	const {user} = store.state
	if(user){
		config.headers.Authorization = `Bearer ${user.data.token}`
	}
	return config
},function(err){
	Promise.reject(err)
})

// 处理Token过期     
request.interceptors.response.use(response=>{
	// 在2XX范围内的状态码都会触发此函数，主要处理响应数据
	
	return response
},async error=>{
	// 获取错误码
	const status = error.response.status
	if(status === 400){
		// 客户端请求参数错误
		Toast.fail('客户端请求参数异常')
	}else if(status === 401){
		const {user} = store.state
		// 如果连用户都没有 那么直接跳转到登录页面
		if(!user || !user.data.token){
			return redirectLogin()
		}
		try{
			// 在这里创建一个新的axios 那么他发出的请求就不会再走 axios的实例request了
			const res = await axios({
				url:'/app/v1_0/authorizations',
				headers:{
					Authorization:`Bearer ${user.data.refresh_token}`
					},
				method:'PUT'	
			})
			// 如果请求成功 那么服务器返回的是一个全新的token
			// 拿到全新的token 那么就要替换旧的token
			user.data.token = res.data.token
			store.commit('setUser',user)
			
			// 更新完毕后就要把之前的失败请求重新再发出去，此时 token是最新的token 那么从新发送请求就能得成功登陆
			// error.config 是本次请求的相关配置信息对象
			 return request(error.config)
			
		}catch(err){
			console.log('刷新token失败，跳转到登录页面')
			redirectLogin()
		}
	}else if(status === 404){
		Toast.fail('请求的资源不存在')
	}else if(status === 403){
		
		Toast.fail('服务器错误')
	}
	return Promise.reject(error);
})
function redirectLogin(){
	// router.replace('/login')
	// 以名字进行跳转，并以query传递查询参数
	router.replace({
		name:'login',
		query:{
			//数据名自定义，拿到当前路由路径，router.currentRoute 与在组件中的this.$route是一个东西
			'redirect':router.currentRoute.fullPath
		}
	})
}
router.beforeEach((to,from,next)=>{
	// 判断进入的页面是否需要登录
	if(to.meta.requiresAuth){
		// 判断登录状态
		if(store.state.user){
			// 如果是已经登录的状态则直接放行 并return 后面代码不再执行
			return next()
		}
		Dialog.confirm({
			title:'访问提示',
			message:'是否跳转到登录页面?'
		}).then(()=>{
			// 确认登录
			router.replace({
				name:'login',
				query:{
					'redirect':router.currentRoute.fullPath
				}
			})
		}).catch(()=>{
			// 取消确认
			// 中断操作
			next(false)
		})
	}else{
		// 如果不需要登录 那就直接放行
		next()
	}
})
export default request